home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / sbin / liloconfig < prev    next >
Text File  |  2008-05-15  |  22KB  |  684 lines

  1. #!/usr/bin/perl
  2. #
  3. # /usr/sbin/liloconfig -- configure lilo automatically using debconf
  4. #
  5. # Author:    Bruce Perens <bruce@Pixar.com>
  6. #        Bernd Eckenfels <ecki@debian.org>
  7. #        Vincent Renardias <vincent@ldsol.com>
  8. #        Peter Maydell <pmaydell@chiark.greenend.org.uk>
  9. #        Russell Coker <russell@coker.com.au>
  10. #               AndrΘs Roldßn <aroldan@debian.org>
  11. #
  12. # Maintainer:   AndrΘs Roldßn <aroldan@debian.org>
  13.  
  14. # Updated on 2006/08/27 -- Artur R. Czechowski <arturcz@hell.pl>
  15. # - Communication with user is handled via debconf
  16. #
  17. # Updated on 2004/07/31 -- AndrΘs Roldßn <aroldan@debian.org>
  18. # - Added get_bitmap() to allow one choose the bitmap to use.
  19. #
  20. # Updated on 2003/12/20 -- AndrΘs Roldßn <aroldan@debian.org>
  21. # - Modified get_images() to insert initrd= field when necessary.
  22. #   See Bug#224368.
  23. #   
  24. # Updated on 2003/10/24 -- AndrΘs Roldßn <aroldan@debian.org>
  25. # - Now liloconfig will smartly get the installed kernel images
  26. #   and put them in the configuration file.
  27. #
  28. # Updated on 2003/10/05 -- AndrΘs Roldßn <aroldan@debian.org>
  29. # - Updated install= comments . See Bug#183471.
  30. # - Not using depecrated install=/boot/*b options.
  31. #
  32. # Updated on 2003/08/07 -- AndrΘs Roldßn <aroldan@fluidsignal.com>
  33. # - bitmap= field will search bitmaps on /boot 
  34. #
  35. # Updated on 2003/04/23 -- AndrΘs Roldßn <aroldan@fluidsignal.com>
  36. # - added menu entry for sid and sarge from debian-bootscreen.
  37. #
  38. # Updated on 1999/01/24 -- Vincent Renardias <vincent@ldsol.com>
  39. #  - never return 0 on error.
  40. #  - updated the template to produce a more helpfull (commentwise)
  41. #      resulting lilo.conf
  42. #
  43. # Updated on 1999/11/24 -- Peter Maydell <pmaydell@chiark.greenend.org.uk>
  44. #  - added error checking of various system calls
  45. #  - added $DEBUG switch and pulled lilo.conf and fstab filenames
  46. #    out into config variables.
  47. #  - turned on Perl's -w switch and use strict subs/refs
  48. #  - now does examination of current situation up front, separated
  49. #    from the logic of what we do in various situations.
  50.  #  - added check for special marker in /etc/fstab that indicates that we
  51.  #    are configuring the base filesystem and shouldn't actually do anything.
  52.  #
  53.  # Updated on 2000-01-23 -- Peter Maydell <pmaydell@chiark.greenend.org.uk>
  54.  #  - fixed a (harmless) warning produced if /etc/fstab had a blank line in it
  55.  #  - fixed a bug where partition number was not being pulled out of the
  56.  #    /dev/hda4 string correctly.
  57.  #  - added a paranoia check that the disk/device we get from fstab actually
  58.  #    exist in the filesystem.
  59.  #  - fixed flow-of-control problem where we simply weren't ever installing
  60.  #    MBR and making partition active.
  61.  #  - added & to some function calls, for consistency.
  62.  #  - changed all references to /usr/doc/lilo/ to /usr/share/doc/lilo/.
  63.  #  - added warning that the lilo.conf we produce does not suffice for
  64.  #    complicated situations.
  65.  #  - expanded some of the other prompts and explanatory text presented
  66.  #    to the user.
  67.  #  - added a 'ruler' to separate out questions
  68.  #  - questions no longer accept anything except RET as meaning 'go with
  69.  #    default answer'. [Previously, if the default answer was 'yes',
  70.  #    anything not beginning with Y or y would be interpreted as 'no'.
  71.  #    This is IMHO too lenient considering the consequences of getting
  72.  #    it wrong...]
  73.  #  - updated Maintainer, Author and Wishlist...
  74.  #
  75.  # Updated on 2000-01-25 -- Peter Maydell <pmaydell@chiark.greenend.org.uk>
  76.  #  - fixed important bug causing lilo not to install on RAID arrays.
  77.  #    (Bugs #56153,#56183,#56196)
  78.  #  - minor improvement to a regexp (no actual functional change) (Bug#56127)
  79.  #  - expanded cryptic 'iff' comment (Bug#56127)
  80.  #
  81.  # Updates on 2001-05-04 -- Russell Coker <russell@coker.com.au>
  82.  #  - more work on devfs root support
  83.  
  84.  # Wishlist:
  85.  # This script is from Bruce's debian.postinst and need to be more
  86.  # intelligent. It should be possible to install lilo in the MBR, too.
  87.  # Support for systems which dual boot (esp. dual Linux/Windows) would
  88.  # also be nice, but could be complicated to get right.
  89.  
  90.  ###use strict 'subs';
  91.  ###use strict 'refs';
  92.  #### use strict 'vars' falls over on all the global variables :->
  93. use Debconf::Client::ConfModule qw(:all);
  94. version('2.0');
  95. $|=1;
  96.  
  97.  fset("liloconfig/banner","seen","false");
  98.  fset("liloconfig/use_current_lilo","seen","false");
  99.  fset("liloconfig/wipe_old_liloconf","seen","false");
  100.  fset("liloconfig/instruction","seen","false");
  101.  fset("liloconfig/install_from_root_device","seen","false");
  102.  fset("liloconfig/use_lba32","seen","false");
  103.  fset("liloconfig/install_mbr","seen","false");
  104.  fset("liloconfig/make_active_partition","seen","false");
  105.  fset("liloconfig/select_bitmap","seen","false");
  106.  
  107.  # Set this to 1 to disable all commands that do things to the
  108.  # hard disk (ie actually running lilo). Note that we still write
  109.  # to $LILOCONF, so you should also tweak that to get a 'safe' test
  110.  # environment.
  111.  #$DEBUG=1;
  112.  
  113.  # Various files we access
  114.  $LILOCONF='/etc/lilo.conf';
  115.  $FSTAB='/etc/fstab';
  116.  
  117.  subst("liloconfig/liloconf_exists","liloconf",$LILOCONF);
  118.  subst("liloconfig/lilo_warning","liloconf",$LILOCONF);
  119.  subst("liloconfig/lilo_error","liloconf",$LILOCONF);
  120.  subst("liloconfig/odd_fstab","liloconf",$LILOCONF);
  121.  subst("liloconfig/instruction","liloconf",$LILOCONF);
  122.  
  123.  subst("liloconfig/fstab_broken","fstab",$FSTAB);
  124.  subst("liloconfig/odd_fstab","fstab",$FSTAB);
  125.  
  126.  # Print a banner now, to give the user something to look at while
  127.  # we ferret around in the fstab...
  128.  
  129.  settitle("liloconfig/maintitle");
  130.  input("low","liloconfig/banner");
  131.  
  132.  # First we analyse the setup and set variables appropriately
  133.  $fstab_broken = 1;        # is there a valid /etc/fstab? Assume not and prove otherwise.
  134.  $liloconf_exists = 0;     # is there a preexisting lilo.conf with a non-commented out line?
  135.  $liloconf_incompatible = 0;   # does lilo.conf use options not valid for this version of lilo?
  136.  $configuring_base = 0;    # are we configuring the 'base' filesystem (special case)
  137.  $odd_fstab = 0;         # set if we don't understand the device in the fstab
  138.  # We also set $device, $disk, $partition (assuming fstab_broken == 0)
  139.  
  140.  if (-f $FSTAB) 
  141.  {
  142.      # Parse fstab for the root partition...
  143.      open(FSTAB, "<$FSTAB") or die "liloconfig: couldn't open $FSTAB: $!\n";
  144.      while (<FSTAB>) 
  145.      {
  146.      # Check for a magic string which indicates that we are configuring
  147.      # the base filesystem and not a real machine...
  148.      $configuring_base = 1 if /^# UNCONFIGURED FSTAB FOR BASE SYSTEM/;
  149.      next if /^#/;      # ignore comment lines
  150.      s/^[ \t]+//;      # remove space or tab at begin of the line
  151.      ($device,$filesystem) = split(/[ \t]+/);
  152.      next unless defined $filesystem;   # ignore empty lines too
  153.      # Stop if we found the root device...
  154.      if ($filesystem eq '/') 
  155.      {
  156.          $fstab_broken = 0;
  157.          last;
  158.      }
  159.      }
  160.      close(FSTAB) or die "liloconfig: couldn't close $FSTAB: $!\n";
  161.  }
  162.  
  163.  if (! $fstab_broken) 
  164.  {
  165.      # Valid device/filesystem pair, parse them
  166.      $disk = `/usr/sbin/lilo_find_mbr $device`;
  167.      chomp($disk);
  168.      $partition = $device;
  169.      my $devfs = 0;
  170.  
  171.      # Paranoia check: there should be valid /dev/ nodes for these.
  172.      # We could check for block-special-device-ness, but perhaps
  173.      # some people have symlink forests in /dev/ ?
  174.      # This check will fail on things like RAID arrays, where the
  175.      # devices don't have names like /dev/hda4. In this case we can't
  176.      # do simple autoconfiguration, but we still want to be able
  177.      # to allow the user to install their own handrolled lilo.conf.
  178.      $odd_fstab = 1 unless ($partition =~ /\d+$/ && -e $disk && -e $device);
  179.  }
  180.  
  181.  # Check for an existing lilo.conf with some non-comment lines in it...
  182.  system ("grep -qsv '^#' $LILOCONF");
  183.  # Exit status is 0 iff lilo.conf exists and contains at least one non-comment line.
  184.  if ($? == 0) 
  185.  {
  186.      $liloconf_exists = 1;
  187.      $liloconf_incompatible = &compatibility_check ();
  188.  }
  189.  
  190.  ##########################################################
  191.  # Boilerplate arrays used to produce an initial lilo.conf
  192.  ##########################################################
  193.  
  194.  @header = (
  195.      "# Generated by liloconfig\n",
  196.      "\n",
  197.      );
  198.  
  199.  @bootheader = (
  200.         "# Specifies the boot device\n",
  201.         );
  202.  
  203.  @rootheader = (
  204.         "\n",
  205.         "# Specifies the device that should be mounted as root.\n",
  206.         "# If the special name CURRENT is used, the root device is set to the\n",
  207.         "# device on which the root file system is currently mounted. If the root\n",
  208.         "# has been changed with  -r , the respective device is used. If the\n",
  209.         "# variable ROOT is omitted, the root device setting contained in the\n",
  210.         "# kernel image is used. It can be changed with the rdev program.\n"
  211.         );
  212.  
  213.  @boilerplate1 = (
  214.           "\n",
  215.           "# Enables map compaction:\n",
  216.           "# Tries to merge read requests for adjacent sectors into a single\n",
  217.           "# read request. This drastically reduces load time and keeps the map\n",
  218.           "# smaller. Using COMPACT is especially recommended when booting from a\n",
  219.           "# floppy disk.\n",
  220.           "# compact\n",
  221.           "\n",
  222.           "# Install the specified file as the new boot sector.\n",
  223.           "# LILO supports built in boot sectory, you only need\n",
  224.           "# to specify the type, choose one from 'text', 'menu' or 'bitmap'.\n",
  225.           "# new: install=bmp      old: install=/boot/boot-bmp.b\n",
  226.           "# new: install=text     old: install=/boot/boot-text.b\n",
  227.           "# new: install=menu     old: install=/boot/boot-menu.b or boot.b\n",
  228.           "# default: 'menu' is default, unless you have a bitmap= line\n",
  229.           "# Note: install=bmp must be used to see the bitmap menu.\n",
  230.           "# install=menu\n",
  231.           "install=bmp\n",
  232.           "\n",
  233.           "# Specifies the number of _tenths_ of a second LILO should\n",
  234.           "# wait before booting the first image.  LILO\n",
  235.           "# doesn't wait if DELAY is omitted or if DELAY is set to zero.\n",
  236.           "# delay=20\n",
  237.           "\n",
  238.           "# Prompt to use certaing image. If prompt is specified without timeout,\n",
  239.           "# boot will not take place unless you hit RETURN\n",
  240.           "prompt\n",
  241.           "timeout=50\n",
  242.           "\n",
  243.           "# Specifies the location of the map file. If MAP is\n",
  244.           "# omitted, a file /boot/map is used.\n",
  245.           "map=/boot/map\n",
  246.           "\n",
  247.           "# Specifies the VGA text mode that should be selected when\n",
  248.           "# booting. The following values are recognized (case is ignored):\n",
  249.           "#   NORMAL  select normal 80x25 text mode.\n",
  250.           "#   EXTENDED  select 80x50 text mode. The word EXTENDED can be\n",
  251.           "#     abbreviated to EXT.\n",
  252.           "#   ASK  stop and ask for user input (at boot time).\n",
  253.           "#   <number>  use the corresponding text mode. A list of available modes\n",
  254.           "#     can be obtained by booting with  vga=ask  and pressing [Enter].\n",
  255.           "vga=normal\n",
  256.           "\n",
  257.           "# Defines non-standard parameters for the specified disk.\n",
  258.           "#disk=/dev/sda\n",
  259.           "#\tbios=0x80\n",
  260.           "\n",
  261.           "# If you are using removable USB drivers (with mass-storage)\n",
  262.           "# you will need to tell LILO to not use these devices even\n",
  263.           "# if defined in /etc/fstab and referenced in /proc/partitions.\n",
  264.           "# Adjust these lines to your devices:\n",
  265.           "#\n",
  266.           "# disk=/dev/sda inaccessible\n",
  267.           "# disk=/dev/sdb inaccessible\n",
  268.           "\n"
  269.           );
  270.  
  271.  @boilerplate2 = (
  272.           "# If you have another OS on this machine (say DOS),\n",
  273.           "# you can boot if by uncommenting the following lines\n",
  274.           "# (Of course, change /dev/hda2 to wherever your DOS partition is.)\n",
  275.           "# other=/dev/hda2\n",
  276.           "#   label=\"MS Windows\"\n",
  277.           "\n"
  278.           );
  279.  
  280.  ####################
  281.  # Utility functions
  282.  ####################
  283.  
  284. sub get_bitmap
  285. {
  286.     input("high","liloconfig/select_bitmap");
  287.     go();
  288.     ($ret,$val) = get("liloconfig/select_bitmap");
  289.     
  290.     @bitmaps = (
  291.            [ "/boot/sarge.bmp","1,,0,2,,0","120p,173p,1,15,17","254p,432p,1,0,0" ],
  292.            [ "/boot/sid.bmp","1,,0,2,,0","120p,173p,1,15,17","254p,432p,1,0,0" ],
  293.            [ "/boot/coffee.bmp","12,,11,15,,8","385p,100p,1,10","38,2,13,1" ],
  294.            [ "/boot/debianlilo.bmp","1,,0;9,,0","106p,144p,2,9,144p","514p,144p,6,8,0" ]
  295.            );
  296.  
  297.     $counter = 0;
  298.  
  299.     for $ref (@bitmaps)
  300.     {
  301.     last if ($val eq @$ref[0]);
  302.     $counter++;
  303.     }
  304.  
  305.     $ans = $counter;
  306.  
  307.     push (@bitmapconf, "\n# Bitmap configuration for $bitmaps[$ans][0]\n");
  308.     push (@bitmapconf, "bitmap=$bitmaps[$ans][0]\n");
  309.     push (@bitmapconf, "bmp-colors=$bitmaps[$ans][1]\n");
  310.     push (@bitmapconf, "bmp-table=$bitmaps[$ans][2]\n");
  311.     push (@bitmapconf, "bmp-timer=$bitmaps[$ans][3]\n");
  312.  
  313.     return @bitmapconf;
  314. }
  315.  
  316. sub get_images
  317. {
  318.     my @images = ();
  319.  
  320.     $count = 0;
  321.    
  322.     print STDERR "Searching for installed kernels and updating image entries ...\n";
  323.    
  324.     push (@images, "# These images were automagically added. You may need to edit something.\n\n");
  325.     
  326.     # Ignore that /vmlinuz link since it can surely be poiting to 
  327.     # some /boot/vmlinuz* file
  328.     if (-e "/vmlinuz" && ! -l "/vmlinuz")
  329.     {
  330.     push (@images, "image=/vmlinuz\n");
  331.     push (@images, "\tlabel=\"Linux\"\n");
  332.     if (-e "/initrd.img")
  333.     {
  334.          push (@images, "\tinitrd=/initrd.img\n");
  335.     }
  336.     push (@images, "\tread-only\n");
  337.     push (@images, "\n");
  338.     }
  339.  
  340.     # Ignore that /boot/vmlinuz link as well since it can surely be 
  341.     # poiting to some /boot/vmlinuz* file
  342.     if (-e "/boot/vmlinuz" && ! -l "/boot/vmlinuz")
  343.     {
  344.         push (@images, "image=/boot/vmlinuz\n");
  345.         push (@images, "\tlabel=\"Linux 1\"\n");
  346.         if (-e "/boot/initrd.img")
  347.         {
  348.             push (@images, "\tinitrd=/boot/initrd.img\n");
  349.         }
  350.         push (@images, "\tread-only\n");
  351.         push (@images, "\n");
  352.     }
  353.  
  354.     foreach $image (`/bin/ls /boot/vmlinuz*`)
  355.     {
  356.         chomp $image;
  357.  
  358.     my $version = "";
  359.     my $complement = "";
  360.     
  361.         if ($image =~ /vmlinuz-(\d+\.\d+\.\d+)-(.+)/)
  362.         {
  363.         $version = $1;
  364.         $complement = $2;
  365.         
  366.             $label = "Lin " . $version . "img" . $count;
  367.         }
  368.     elsif ($image =~ /vmlinuz-(\d+\.\d+\.\d+)$/)
  369.     {
  370.         $version = $1;
  371.         
  372.         $label = "Lin " . $version . "img" . $count;
  373.     }
  374.     else
  375.         {
  376.             $label = "Lin " . "img" . $count;
  377.         }
  378.     
  379.         push (@images, "image=$image\n");
  380.         push (@images, "\tlabel=\"$label\"\n");
  381.     
  382.     if (-e "/boot/initrd.img-$version-$complement")
  383.     {
  384.         push (@images, "\tinitrd=/boot/initrd.img-$version-$complement\n");
  385.      }
  386.     elsif (-e "/boot/initrd.img-$version")
  387.     {
  388.         push (@images, "\tinitrd=/boot/initrd.img-$version\n");
  389.     }
  390.  
  391.         push (@images, "\tread-only\n");
  392.     push (@images, "\n");
  393.     
  394.         $count++;
  395.     }
  396.  
  397.     if (-e "/boot/memtest86.bin")
  398.     {
  399.         push (@images, "image=/boot/memtest86.bin\n");
  400.         push (@images, "\tlabel=\"Memory Test\"\n");
  401.         push (@images, "\tread-only\n");
  402.         push (@images, "\n");
  403.     }
  404.  
  405.     if (-e "/boot/memtest86+.bin")
  406.     {
  407.     push (@images, "image=/boot/memtest86+.bin\n");
  408.     push (@images, "\tlabel=\"Memory Test+\"\n");
  409.     push (@images, "\tread-only\n");
  410.     push (@images, "\n");
  411.     }
  412.         
  413.     return @images;
  414. }
  415.  
  416. sub asky 
  417. {
  418.     do 
  419.     {
  420.     print STDERR @_,"? [Yes] ";
  421.     $answer=<STDIN>;
  422.     } 
  423.     while ($answer ne "\n" && !($answer =~ /^[YyNn].*/));
  424.     &ruler ();
  425.     return ( !($answer =~ /^[nN].*/) );
  426. }
  427.  
  428. sub askn 
  429. {
  430.     do 
  431.     {
  432.     print STDERR @_,"? [No] ";
  433.     $answer=<STDIN>;
  434.     } 
  435.     while ($answer ne "\n" && !($answer =~ /^[YyNn].*/));
  436.     &ruler ();
  437.     return ( $answer =~ /^[yY].*/ );
  438. }
  439.  
  440. sub compatibility_check 
  441. {
  442.     # Check a lilo.conf for options which are not compatible
  443.     # with the current version of lilo, and return 1 if any
  444.     # incompatible usages are found.
  445.     # This currently just checks for use of the any_* loaders.
  446.     system ("egrep '^[^#]*any_' $LILOCONF");
  447.     return 1 if ($? == 0);
  448.     return 0;
  449. }
  450.  
  451. sub safe_system($)
  452. {
  453.     # Works like system(), but just echoes the command that would
  454.     # be run if $DEBUG is 1.
  455.     if ($DEBUG) {
  456.     print STDERR "[Would have run: ", join(' ', @_), "]\n";
  457.     $? = 0;
  458.     } 
  459.     else 
  460.     {
  461.     system($_[0].">&2");
  462.     }
  463. }
  464.  
  465. #####################################
  466. # Actual work is done below here...
  467. #####################################
  468.  
  469. # Debian's 'base' filesystem is a special case -- it's prebuilt
  470. # by installing and configuring packages into a subdirectory,
  471. # which is then made into a tarball, which is then used to
  472. # make the initial filesystem for a fresh Debian install.
  473. # Thus we can't actually run LILO now, because we know nothing
  474. # of the disk layout. That will be done as part of the install
  475. # process.
  476. if ($configuring_base) 
  477. {
  478.     input("high","liloconfig/configuring_base");
  479.     go();
  480.  
  481. exit(0);
  482. }
  483.  
  484. if ($liloconf_exists) 
  485. {
  486.     # Trust and use the existing lilo.conf.
  487.     # FIX: If the current lilo.conf installs a master boot record, ask
  488.     #    to edit it to a partition boot record and install the master boot
  489.     #    record to chain to that.
  490.  
  491.     input("high","liloconfig/liloconf_exists");
  492.     go();
  493.  
  494.     if ($liloconf_incompatible) 
  495.     {
  496.     input("high","liloconfig/liloconf_incompatible");
  497.     go();
  498.     exit(1);
  499.     }
  500.     
  501.     set("liloconfig/use_current_lilo","true");
  502.     input("high","liloconfig/use_current_lilo");
  503.     go();
  504.     ($ret,$val)=get("liloconfig/use_current_lilo");
  505.     if ($val eq "true")
  506.     {
  507.     input("high","liloconfig/lilo_warning");
  508.     go();
  509.     stop();
  510.     &safe_system("/sbin/lilo -v");
  511.     if ( $? == 0 ) 
  512.     {
  513.         exit(0);
  514.     }
  515.     input("high","liloconfig/lilo_error");
  516.     go();
  517.     exit(1);
  518.     } 
  519.     else 
  520.     {
  521.         set("liloconfig/wipe_old_liloconf","false");
  522.     input("high","liloconfig/wipe_old_liloconf");
  523.     go();
  524.     ($ret,$val)=get("liloconfig/wipe_old_liloconf");
  525.     if($val eq "true")
  526.     {
  527.         rename($LILOCONF, "$LILOCONF.OLD") or die "liloconfig: couldn't save old $LILOCONF as $LILOCONF.OLD: $!\n";
  528.     }
  529.     else 
  530.     {
  531.         input("high","liloconfig/no_changes");
  532.         go();
  533.         exit(0);
  534.     }
  535.     }
  536. }
  537.  
  538. # ASSERT: that we get here only if there is no lilo.conf or the user
  539. # asked us to wipe out the old one...
  540. # We make checks for broken fstabs and odd devices only if we are 
  541. # going to try to write a lilo.conf for the user.
  542. if ($fstab_broken) 
  543. {
  544.     input("high","liloconfig/fstab_broken");
  545.     go();
  546.     exit(1);
  547. }
  548.  
  549. if ($odd_fstab) 
  550. {
  551.     subst("liloconfig/odd_fstab","device",$device);
  552.     input("high","liloconfig/odd_fstab");
  553.     go();
  554.     exit(1);
  555. }
  556.  
  557. input("high","liloconfig/instruction");
  558. go();
  559.  
  560. # Flag so we can print STDERR a warning if we fell out the bottom of the config
  561. # without having run lilo at all.
  562. $lilorun = 0; $madeactive = 0;
  563.  
  564.  
  565. subst("liloconfig/install_from_root_device","device",$device);
  566. set("liloconfig/install_from_root_device","false");
  567. input("high","liloconfig/install_from_root_device");
  568. go();
  569. ($ret,$val)=get("liloconfig/install_from_root_device");
  570.  
  571. if($val eq "true")
  572. {
  573.     umask(077);
  574.     open(CONF, ">$LILOCONF") or die "Couldn't open $LILOCONF for writing: $!\n";
  575.     if (!chown(0, 0, "$LILOCONF")) 
  576.     {
  577.     die "Couldn't make $LILOCONF owned by root.root: $!\n" unless $DEBUG;
  578.  
  579.     # Following message is only shown if $DEBUG is set. So, I do not care
  580.     # about templating it. Let it goes into STDERR. YMMV. <arturcz@hell.pl>
  581.     print STDERR "Oops, couldn't make $LILOCONF owned by root.root. Since you\n";
  582.     print STDERR "have set the DEBUG flag, I'm going to assume this is because\n";
  583.     print STDERR "you're running liloconfig as a normal user, and continue anyway.\n";
  584.     }
  585.     print CONF @header;
  586.     input("high","liloconfig/install_from_root_device");
  587.     go();
  588.     ($ret,$val)=get("liloconfig/install_from_root_device");
  589.     if($val eq "true")
  590.     {
  591.     print CONF "# This allows booting from any partition on disks with more than 1024\n"; 
  592.     print CONF "# cylinders.\n";
  593.     print CONF "lba32\n";
  594.     print CONF "\n";
  595.     }
  596.     @middle_boilerplate = &get_images;
  597.     @bmp_boilerplate = &get_bitmap;
  598.  
  599.     print CONF @bootheader, "boot=".$device, "\n", @rootheader, "root=".$device, "\n", @bmp_boilerplate, @boilerplate1, @middle_boilerplate, @boilerplate2;
  600.     
  601.     close(CONF) or die "Couldn't close $LILOCONF: $!\n";
  602.     
  603.     &safe_system("/sbin/lilo");
  604.     if ($? != 0) 
  605.     {
  606.     input("high","liloconfig/lilo_error");
  607.     go();
  608.     exit(1);
  609.     }
  610.     $lilorun = 1;
  611. }
  612.  
  613.  
  614. subst("liloconfig/install_mbr","disk",$disk);
  615. set("liloconfig/install_mbr","false");
  616. input("high","liloconfig/install_mbr");
  617. go();
  618. ($ret,$val)=get("liloconfig/install_mbr");
  619. if($val eq "true")
  620. {
  621.     &safe_system("install-mbr $disk");
  622.     if ($? != 0) 
  623.     {
  624.     input("high","liloconfig/mbr_error");
  625.     go();
  626.     exit(1);
  627.     }
  628. }
  629.  
  630. subst("liloconfig/make_active_partition","device",$device);
  631. input("high","liloconfig/make_active_partition");
  632. go();
  633. ($ret,$val)=get("liloconfig/install_mbr");
  634. if($val eq "true")
  635. {
  636.     my $part_num = $partition;
  637.     $part_num =~ s/^.*[a-z]//;
  638.     print STDERR "Activating Partition $part_num on disk $disk.\n";
  639.     &safe_system("/sbin/activate $disk $part_num");
  640.     if ($? != 0) 
  641.     {
  642.     input("high","liloconfig/activate_error");
  643.     go();
  644.     exit(1);
  645.     }
  646.     $madeactive = 1;
  647. }
  648.  
  649. # Trailer: summarise what we've done
  650. print STDERR "\n";
  651. if (! $lilorun) 
  652. {
  653.     print STDERR "WARNING: you will have to set up LILO manually to ensure that\n";
  654.     print STDERR "     your system can be booted successfully!\n";
  655.     print STDERR "You can rerun liloconfig at any time if you change your mind and\n";
  656.     print STDERR "wish to use the default configuration.\n";
  657. elsif ($madeactive) 
  658. {
  659.     # LILO was run and Linux partition made active
  660.     print STDERR "LILO successfully configured; Linux will be booted by default.\n";
  661.     print STDERR "If you installed the master boot record, you can boot a different\n";
  662.     print STDERR "OS by holding down the shift key as the system boots, and then\n";
  663.     print STDERR "pressing the key corresponding to the partition containing that\n";
  664.     print STDERR "OS when you see the \"1234F:\" prompt.\n";
  665. }
  666. else
  667. {
  668.     my $part_num = $partition;
  669.     $part_num =~ s/^.*[a-z]//;
  670.     # LILO run, but Linux partition not made active
  671.     print STDERR "OK. If you installed the master boot record, and the partition\n";
  672.     print STDERR "boot record, you may boot Linux by holding down the shift key\n";
  673.     print STDERR "as the system boots, and then pressing the $part_num key\n";
  674.     print STDERR "when you see the \"1234F:\" prompt.\n";
  675. }
  676.  
  677. print STDERR "\n";
  678. print STDERR "For more information about LILO, see the documentation in\n";
  679. print STDERR "/usr/share/doc/lilo/. For details about the MBR, see also\n";
  680. print STDERR "/usr/share/doc/mbr/.\n";
  681.  
  682. exit(0);
  683.